This invention concerns software components and more particularly stubs that contain, or describe, their own proxies and inject such proxies into target environments.
In general, a “software component” is a computer program object or a collection of objects that conforms to a specification, such as the component object model (COM), the distributed component object model (DCOM), the Ericsson component model (ECM) Java, etc. The COM, for example, is described at Microsoft's website. In general, a software component exists within a context, i.e., a component environment according to a model, such as COM, ECM, etc.
Software component interfaces can be described in binary or textual forms according to suitable interface description languages (IDLs), and thus a software component can exist in a processor as an entity that is separate from other software components in the processor. A software component provides one or more interfaces, and uses other software components only via their respective interfaces. In particular, this means that two software components implementing the same interface are interchangeable in many situations.
The advantages of using software components include modularity, support for distributed processing systems, and language independence, which means that software components implemented in different computer programming languages can work together.
It is often the case that software components need to interact over network, language, or other boundaries. When a software component is to be accessed or shared across execution contexts or network links, a process of serialization, or marshalling, is used for encoding method invocations (including parameter values), allowing invocations to be forwarded across boundaries.
It is common to use “proxies” and “stubs” (which are further described below) for interactions of software components across boundaries. A proxy-stub pair enables two software components to communicate (i.e., interact) as if they were located within the same processor address space, thus making the software components independent of the particular communication details. The role of the proxy is to receive method invocations on behalf of a “remote” interface, and pass these method invocations on to a remote stub. The term “remote” here means “located in a separate address space”. The role of the stub is to receive method invocations, and to pass them on to a “local” interface. The term “local” here means “located in the same address space”.
Thus, a proxy, in a very general form, is an object functioning as an interface to something else, and that something else can be anything: a network connection, an object in memory, a file, or another resource that may be expensive or difficult to duplicate. In software development, a stub is a piece of programming code that is used to stand in for some other programming functionality. For example, a stub may simulate the behavior of existing code (such as a procedure on a remote machine) or be a temporary substitute for yet-to-be-developed code. Stubs are therefore useful in distributed computing in addition to software development and testing.
FIG. 1 depicts a generalized distributed system having two address spaces separated by an address space boundary. Two software components A and B can interact across the boundary through a proxy-stub pair IX_proxy and IX_stub. The IX_proxy is typically created by the system or environment on demand, and implements an Interface IX that is the same or at least substantially the same as an Interface IX of component B. Software components reference each other by using interface references, and such uses are independent of which component implements the referenced interface. Hence, software component A does not need to know it is using a proxy: methods in Interface IX can be invoked just as if the Interface IX of software component B were used directly.
As noted above, software component A invokes a method in Interface IX of software component B by the process of marshalling, which involves messages that include all method parameters, as follows:
component A invokes the method using an IX reference, which refers to an IX_proxy (indicated in FIG. 1 by the arrow 1);
the IX_proxy sends to the IX_stub a message, which contains all necessary information about the method invocation, such as the interface identity, method identity, and parameters (indicated in FIG. 1 by the arrow 2); and
the IX_stub receives the message and performs the actual method invocation in Interface IX in the component B (indicated in FIG. 1 by the arrow 3).
The return value, and possibly output parameters, of component B, if any, are sent back via the proxy to software component A by a similar method (not shown in FIG. 1).
This sort of situation applies in a distributed processing system, in which software components are located in different processing systems that are parts of the distributed system, and it also frequently applies to software components implemented in different languages. For example, a software component implemented in the Java programming language typically cannot share memory with one implemented in the C programming language. Such components are considered as residing in separate address spaces. In this application, the terms “distributed system” or “distributed systems” and “distributed component” or “distributed components” cover both of those situations.
Java Connected Limited Device Configuration (CLDC) is a platform or environment that is often used in devices having limited processing resources, such as mobile telephones and terminals, and Java CLDC and other platforms do not allow “native” computer code to be downloaded or installed into terminals after production. Native code, or native language, is simply machine code developed to run on a specific processor. It is generally not desirable to install such code in mobile terminals after production, since native code needs to be developed for the particular processor at hand, is complex to install, and gains unlimited control of the system (thus breaching the strict security requirements of a mobile terminal device). Thus, such platforms preclude the use of “callbacks” (i.e., calls from a platform to an application) unless proxies for all possible callbacks are installed permanently in a terminal during production. Such callback-proxy installation is unrealistic due to constraints on the size of flash memory in many mobile terminals and similar devices.
European Patent Publication EP 1 122 644, which corresponds in part to U.S. Patent Application Publication U.S. 2001/0037417, for “A Method and System for Dynamically Dispatching Function Calls from a First Execution Environment to a Second Execution Environment” describes techniques for automatic marshalling (generated from IDL), but does not concern the particular challenges with callbacks, only forward calls, and hence does not concern injecting proxies from stubs.
U.S. Patent Application Publication No. U.S. 2002/0199036 describes methods of saving bandwidth in a distributed system by introducing active proxies, which contain logic and permit functionality to be executed locally, without accessing the remote objects. Such a proxy can implement some methods locally without contacting a represented object, and is based on Remote Method Invocation (RMI), which is a Java routine. RMI enables a Java program running on one computer to access objects and methods of another Java program running on a different computer, with a Java Virtual Machine handling the communication. Because Java is run on both sides, code can be dynamically downloaded on both sides, and thus proxy injections are not necessary and problems with safe dynamic loading of new clients that listen to callbacks from a native environment are not encountered.
U.S. Pat. No. 6,157,961 describes a distributed computing system having logic modules that include a client-side stub generator and a client-side stub interpreter for generating/decompressing/interpreting proxies at runtime in RMI/RPC contexts. “RPC” is Remote Procedure Call, which is a protocol that allows a program running on one host processor to cause code to be executed on another host processor. The proxy code is divided into two parts, one that is common to all proxy operations and the other that is unique. Thus, the memory space needed by the client-side stubs can be minimized. Like the previously cited publications, problems with safe dynamic loading of new clients that listen to callbacks from a native environment are not encountered.
These limitations on the use of callbacks in distributed systems that include mobile and other communication devices cause problems that so far have not been adequately solved.